/**
 * 项目名称:
 *
 * @Author: 夏国倩
 * @Date: 2023/10/12 14:12
 * @Copyright
 */
package multithreading;
/*
t1和t2
异步编程模型：t1线程执行t1的，t2线程执行t2的，这两个线程之间谁也不等谁
同步编程模型：t1线程和t2线程执行，当t1线程必须等t2线程执行之后，t1才能执行

什么时候要同步？为什么要引入线程同步？
1、为了数据的安全性，尽管应用程序效率降低，但是为了保证数据是安全的，必须加入同步
   线程同步机制使程序变成了单线程
2、什么条件下要使用线程同步
 （1)必须是多线程环境
 （2)多线程环境共享一个数据
 （3）共享的数据涉及到修改操作

 演示取款例子 以下程序不使用线程同步，多线程同时对同一个账户进行取款操作，会出现什么问题？
 */
public class ThreadTest12 {
    public static void main(String[] args) {
        //创建一个公共的账号
        Account act=new Account("actno-001",5000);
        //创建线程对同一个账户取款
        Thread t1=new Thread(new Processor12(act));
        Thread t2=new Thread(new Processor12(act));

        t1.start();
        t2.start();
    }
}
//取款线程
class Processor12 implements Runnable{
    //账户
    Account act;
    //构造器
    public Processor12(Account act){
        this.act=act;
    }
    @Override
    public void run() {
        act.withdraw(1000);
        System.out.println("取款1000.00成功，余额："+act.getBalance());
    }
}
//账户
class Account{
    private String actno;
    private double balance;

    public Account() {
    }

    public Account(String actno, double balance) {
        this.actno = actno;
        this.balance = balance;
    }

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "Account{" +
                "actno='" + actno + '\'' +
                ", balance=" + balance +
                '}';
    }
    //对外取款的方法
    public void withdraw(double money){ //对当前账户进行取款操作
        double after=balance-money;
        //延迟
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        this.setBalance(after);
    }
}